package com.itheima.filter;

import com.itheima.pojo.User;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 过滤器(Filter)
 * 概念：Filter 过滤器，Servlet规范中三个技术 Servlet、Listener、Filter之一
 * <p>
 * Filter是sun公司中servlet2.3后增加的一个新功能，在javaEE(JavaWeb)中定义了一个接口 javax.servlet.Filter来描述过滤器。
 * <p>
 * 过滤器可以把对资源的请求拦截下来，从而实现一些特殊的功能。
 * 过滤器一般完成一些通用的操作，比如：登录校验、统一编码处理、敏感字符处理等。
 */

/**
 * 添加Filter过程:
 * 1.定义Filter：定义一个类，实现 Filter 接口，并重写其所有方法。
 * 2.配置Filter：Filter类上加 @WebFilter(urlPatterns="/*") 注解，配置拦截资源的路径。引导类上加 @ServletComponentScan 开启Servlet组件支持。
 */


@Slf4j
@WebFilter("/*")
//Filter 可以根据需求，配置不同的拦截资源路径：
//拦截路径	        urlPatterns值	含义
//拦截具体路径	    /login	        只有访问 /login 路径时，才会被拦截
//目录拦截	        /emps/*	        访问/emps下的所有资源，都会被拦截
//拦截所有	        /*	            访问所有资源，都会被拦截
public class LoginFiler implements Filter {

    /**
     * 过滤方法  用于演示过滤器的基本使用
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
//    @Override
//    public void doFilter(ServletRequest servletRequest,
//                         ServletResponse servletResponse,
//                         FilterChain filterChain) throws IOException, ServletException {
//
//        log.info("我是过滤器，我把你的请求拦截下来了!");
//
//        //观察拦截的路径
//        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//        String requestURI = httpServletRequest.getRequestURI();
//        log.info("本次拦截到的请求路径为:{}", requestURI);//{}是Slf4j打印日志时的占位符
//
//
//        log.info("我把你的请求放行了!");
//        filterChain.doFilter(servletRequest, servletResponse);//放行后将继续执行后续过滤器(一个web应用中，可以配置多个过滤器，这多个过滤器就形成了一个过滤器链)或者访问对应资源，资源访问完成后，还会回到Filter中,将会继续执行放行后的逻辑
//    }


    /**
     * 登录校验过滤器
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        log.info("我是过滤器，我把你的请求拦截下来了!");

        //观察拦截的路径
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String requestURI = httpServletRequest.getRequestURI();
        log.info("本次拦截到的请求路径为:{}", requestURI);//{}是Slf4j打印日志时的占位符




        /*从session中获取登录信息，有则说明之前登陆过，往session中放过登录信息，没有则说明没有进入登录状态*/
        HttpSession session = httpServletRequest.getSession();
        User loginUser = (User) session.getAttribute("loginUser");


        /*如果请求路径是登录相关的路径,不应当拦截,而是直接放行*/
        if (requestURI.contains("login.html")
                || requestURI.contains("css")
                || requestURI.contains("js")
                || requestURI.contains("login")) {
            //放行
            loginUser = new User();
//            filterChain.doFilter(servletRequest,servletResponse);
//            return;
        }


        /*如果是登录状态就放行*/
        if (loginUser != null) {
            log.info("我把你的请求放行了!");
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //TODO  response.getWriter().write(
            // 转成JSON↓
            // Result.error("对不起，您的用户名或密码有误！")
            // );
            //具体写法见瑞吉外卖项目ReggieProject
        }


    }


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("过滤器创建啦！");
    }

    @Override
    public void destroy() {
        log.info("过滤器销毁啦！");
    }
}
